﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ShuticsBiz;
using ShuticsEntities;

namespace TPDiseño2011
{
    public partial class frmEvaluarCandidatos : Form
    {
        List<Puesto> puestos;
        List<Empresa> emp;
        Dictionary<Candidato, string> claves;
        public event EventHandler VolverTabInicio;

        public frmEvaluarCandidatos()
        {
            InitializeComponent();
            dgvCandidatosAEvaluar.AutoGenerateColumns = false;
            dgvCandidatosAEvaluar.DataSource = new BindingList<Candidato>();
        }

        private void frmEvaluarCandidatos_Activated(object sender, EventArgs e)
        {
            txtFiltroApellido.Focus();
        }

        private void wizard1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (wizard1.SelectedIndex == 1)
            {
                puestos = ControlPuesto.GetPuestos();
                emp = ControlPuesto.GetEmpresas();
                cbEmpresa.DataSource = emp;
                CargarPuestosCascada();
            }
        }

        #region Paso1      
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            BuscarCandidatos();
        }

        private void BuscarCandidatos()
        {
            if (txtFiltroApellido.Text == String.Empty && txtFiltroNombre.Text == String.Empty && txtFiltroNroCandidato.Text == String.Empty && txtFiltroNroEmpleado.Text == String.Empty)
            {
                lblErrorFiltros.Visible = true;
            }
            else
            {
                SetearHabilitacionFiltros(false);
                int? nroEmp = txtFiltroNroEmpleado.Text.Equals("") ? (int?)null : int.Parse(txtFiltroNroEmpleado.Text.Trim());
                int? nroCand = txtFiltroNroCandidato.Text.Equals("") ? (int?)null : int.Parse(txtFiltroNroCandidato.Text.Trim());
                dgvCandidatos.AutoGenerateColumns = false;
                List<Candidato> result = ControlCandidato.Buscar(nroEmp, nroCand, txtFiltroApellido.Text, txtFiltroNombre.Text);
                result.RemoveAll(c => ((BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource).Any(d => c == d));
                dgvCandidatos.DataSource = new BindingList<Candidato>(result);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            SetearHabilitacionFiltros(true);
        }

        private void SetearHabilitacionFiltros(bool habilitado)
        {
            txtFiltroApellido.Enabled = habilitado;
            txtFiltroNombre.Enabled = habilitado;
            txtFiltroNroCandidato.Enabled = habilitado;
            txtFiltroNroEmpleado.Enabled = habilitado;
            btnBuscar.Enabled = habilitado;
            btnLimpiar.Enabled = !habilitado;

            if (habilitado)
            {
                txtFiltroApellido.Text = String.Empty;
                txtFiltroNombre.Text = String.Empty;
                txtFiltroNroCandidato.Text = String.Empty;
                txtFiltroNroEmpleado.Text = String.Empty;
                txtFiltroApellido.Focus();
            }

            lblErrorFiltros.Visible = false;            
        }

        private void txtFiltros_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {
            tooltipFiltros.Show("Sólo se pueden ingresar dígitos", (MaskedTextBox)sender, 0, 20, 2000);
        }

        private void dgvCandidatos_DataSourceChanged(object sender, EventArgs e)
        {
            btnSeleccionarTodoCand.Enabled = dgvCandidatos.DataSource == null ? false : ((BindingList<Candidato>)dgvCandidatos.DataSource).Count > 0;
        }

        private void dgvCandidatosAEvaluar_DataSourceChanged(object sender, EventArgs e)
        {
            btnSeleccionarTodoEvaluados.Enabled = dgvCandidatosAEvaluar.DataSource == null ? false : ((BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource).Count > 0;
        }

        private void btnSeleccionarTodoCand_Click(object sender, EventArgs e)
        {
            bool seleccionarTodo = btnSeleccionarTodoCand.Text.Equals("Seleccionar Todo") ? true : false;

            foreach (DataGridViewRow row in dgvCandidatos.Rows)
            {
                ((DataGridViewCheckBoxCell)row.Cells[0]).Value = seleccionarTodo;
            }

            if (seleccionarTodo)
            {
                btnSeleccionarTodoCand.Text = "Deseleccionar Todo";
            }
            else
            {
                btnSeleccionarTodoCand.Text = "Seleccionar Todo";
            }
        }

        private void btnSeleccionarTodoEvaluados_Click(object sender, EventArgs e)
        {
            bool seleccionarTodo = btnSeleccionarTodoEvaluados.Text.Equals("Seleccionar Todo") ? true : false;

            foreach (DataGridViewRow row in dgvCandidatosAEvaluar.Rows)
            {
                ((DataGridViewCheckBoxCell)row.Cells[0]).Value = seleccionarTodo;
            }

            if (seleccionarTodo)
            {
                btnSeleccionarTodoEvaluados.Text = "Deseleccionar Todo";
            }
            else
            {
                btnSeleccionarTodoEvaluados.Text = "Seleccionar Todo";
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                bool cambio = false;
                BindingList<Candidato> leftSource = (BindingList<Candidato>)dgvCandidatos.DataSource;                
                BindingList<Candidato> rightSource = (BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource;
                
                for(int i=0; i<dgvCandidatos.Rows.Count; i++)
                {
                    if (((DataGridViewCheckBoxCell)dgvCandidatos.Rows[i].Cells[0]).Value != null && (bool)((DataGridViewCheckBoxCell)dgvCandidatos.Rows[i].Cells[0]).Value)
                    {
                        cambio = true;
                        rightSource.Add(leftSource.ElementAt(i));
                        leftSource.RemoveAt(i--);
                    }
                }

                if (cambio)
                {
                    dgvCandidatos.DataSource = null;
                    dgvCandidatosAEvaluar.DataSource = null;
                    dgvCandidatos.DataSource = leftSource;
                    dgvCandidatosAEvaluar.DataSource = new BindingList<Candidato>(rightSource.OrderBy(c => c.Apellido).ThenBy(c => c.Nombre).ToList());
                    if (leftSource.Count == 0)
                    {
                        btnSeleccionarTodoCand.Text = "Seleccionar Todo";
                    }
                    lblCandidatosNoEvaluables.Visible = false;
                }
                else
                {
                    toolTipSeleccionCandidatos.Show(Messages.DEBESELECCIONARCANDIDATO, tpPaso1, btnAgregar.Location.X + btnAgregar.Size.Width, btnAgregar.Location.Y + btnAgregar.Size.Height, 3000);
                }
            }
            catch (Exception)
            {

            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            try
            {
                bool cambio = false;
                BindingList<Candidato> leftSource = (BindingList<Candidato>)dgvCandidatos.DataSource;
                BindingList<Candidato> rightSource = (BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource;

                for (int i = 0; i < dgvCandidatosAEvaluar.Rows.Count; i++)
                {
                    if (((DataGridViewCheckBoxCell)dgvCandidatosAEvaluar.Rows[i].Cells[0]).Value != null && (bool)((DataGridViewCheckBoxCell)dgvCandidatosAEvaluar.Rows[i].Cells[0]).Value)
                    {
                        cambio = true;
                        Candidato aQuitar = rightSource.ElementAt(i);

                        if (!txtFiltroApellido.Enabled && aQuitar.Apellido.ToUpper().Contains(txtFiltroApellido.Text) && aQuitar.Nombre.ToUpper().Contains(txtFiltroNombre.Text) &&
                            aQuitar.NroCandidato.ToString().Contains(txtFiltroNroCandidato.Text.Trim()) && aQuitar.NroEmpleado.ToString().Contains(txtFiltroNroEmpleado.Text.Trim()))
                        {
                            leftSource.Add(rightSource.ElementAt(i));
                        }
                        rightSource.RemoveAt(i--);
                    }
                }

                if (cambio)
                {
                    dgvCandidatos.DataSource = null;
                    dgvCandidatosAEvaluar.DataSource = null;
                    dgvCandidatos.DataSource = new BindingList<Candidato>(leftSource.OrderBy(c => c.Apellido).ThenBy(c => c.Nombre).ToList());
                    dgvCandidatosAEvaluar.DataSource = rightSource;
                    if (rightSource.Count == 0)
                    {
                        btnSeleccionarTodoEvaluados.Text = "Seleccionar Todo";
                    }
                    lblCandidatosNoEvaluables.Visible = false;
                }
                else
                {
                    toolTipSeleccionCandidatos.Show(Messages.DEBESELECCIONARCANDIDATO, tpPaso1, btnQuitar.Location.X + btnQuitar.Size.Width, btnQuitar.Location.Y + btnQuitar.Size.Height, 3000);
                }
            }
            catch (Exception)
            {

            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            if (((BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource).Count > 0)
            {
                List<Candidato> noEvaluables = ControlCuestionario.BuscarCandCuestActivo(((BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource).ToList());

                if (noEvaluables.Count > 0)
                {
                    foreach (DataGridViewRow row in dgvCandidatosAEvaluar.Rows)
                    {
                        if (noEvaluables.Any(c => c.ID == ((BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource)[row.Index].ID))
                        {
                            ((DataGridViewCheckBoxCell)row.Cells[0]).Value = true;
                            row.DefaultCellStyle.ForeColor = Color.Red;
                            lblCandidatosNoEvaluables.Visible = true;
                        }
                    }
                }
                else
                {
                    Wizard paginas = (Wizard)((Button)sender).Parent.Parent;
                    paginas.SelectedIndex = paginas.SelectedIndex + 1;
                    this.AcceptButton = btnSiguientePaso2;
                    this.CancelButton = btnCancelarPaso2;
                }
            }
            else
            {
                toolTipSeleccionCandidatos.Show(Messages.DEBESELECCIONARCANDIDATO, tpPaso1, btnSiguiente.Location.X + btnSiguiente.Size.Width, btnSiguiente.Location.Y + btnSiguiente.Size.Height, 3000);
            }
        }        
        #endregion Paso1

        #region Paso2
        private void cbEmpresa_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarPuestosCascada();
        }

        private void CargarPuestosCascada()
        {
            List<Puesto> puestosxEmpresa = puestos.Where(c => c.Empresa.ID == ((Empresa)cbEmpresa.Items[cbEmpresa.SelectedIndex]).ID).ToList();
            cbPuesto.DisplayMember = "Nombre";
            cbPuesto.ValueMember = "ID";
            cbPuesto.DataSource = puestosxEmpresa.Count > 0 ? puestosxEmpresa : null;

            lblNoExistenPuestosEmpresa.Visible = puestosxEmpresa.Count == 0;

            MostrarPonderaciones();
        }

        private void cbPuesto_SelectedIndexChanged(object sender, EventArgs e)
        {
            MostrarPonderaciones();
        }

        private void MostrarPonderaciones()
        {
            if (cbPuesto.DataSource != null)
            {
                dgvCompetencias.AutoGenerateColumns = false;
                dgvCompetencias.DataSource = ((Puesto)cbPuesto.Items[cbPuesto.SelectedIndex]).Ponderaciones.ToList();
            }
            else
            {
                dgvCompetencias.DataSource = null;
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Salir();
        }

        private void Salir()
        {
            if (VolverTabInicio != null)
            {
                VolverTabInicio(this, null);
            }
            this.Close();
        }

        private void dgvCompetencias_DataSourceChanged(object sender, EventArgs e)
        {
            if (dgvCompetencias.DataSource != null && ((List<PuestoCompetencia>)dgvCompetencias.DataSource).Count > 0)
            {
                lblPuestoNoPoseeCompetencias.Visible = false;
                List<Competencia> compNoEvaluables = ControlPuesto.EsEvaluable(((Puesto)cbPuesto.Items[cbPuesto.SelectedIndex]));
                if (compNoEvaluables.Count > 0)
                {
                    //El puesto posee competencias no evaluables.
                    btnSiguientePaso2.Enabled = false;

                    foreach (DataGridViewRow row in dgvCompetencias.Rows)
                    {
                        if (compNoEvaluables.Any(c => c.ID == ((List<PuestoCompetencia>)dgvCompetencias.DataSource)[row.Index].Competencia.ID))
                        {
                            row.DefaultCellStyle.ForeColor = Color.Red;
                            lblCompetenciasNoEvaluables.Visible = true;
                        }
                    }
                }
                else
                {
                    //El puesto es evaluable.
                    btnSiguientePaso2.Enabled = true;
                    lblCompetenciasNoEvaluables.Visible = false;                    
                }
            }
            else
            {
                //El puesto no posee competencias.
                btnSiguientePaso2.Enabled = false;
                lblCompetenciasNoEvaluables.Visible = false;
                lblPuestoNoPoseeCompetencias.Visible = true;
            }
        }

        private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (((DataGridView)sender).Columns[e.ColumnIndex].DataPropertyName.Contains("."))
            {
                e.Value = EvaluateValue(((DataGridView)sender).Rows[e.RowIndex].DataBoundItem, ((DataGridView)sender).Columns[e.ColumnIndex].DataPropertyName);
            }
        }

        public string EvaluateValue(object obj, string property)
        {
            string prop = property;
            string ret = string.Empty;

            if (property.Contains("."))
            {
                prop = property.Substring(0, property.IndexOf("."));
                System.Reflection.PropertyInfo[] props = obj.GetType().GetProperties();

                foreach (System.Reflection.PropertyInfo propa in props)
                {
                    object obja = propa.GetValue(obj, new object[] { });

                    if (obja != null && obja.GetType().Name.Contains(prop))
                    {
                        ret = EvaluateValue(obja, property.Substring(property.IndexOf(".") + 1));
                        break;
                    }
                }
            }
            else
            {
                System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(prop);
                ret = pi.GetValue(obj, new object[] { }).ToString();
            }

            return ret;
        }

        private void btnSiguientePaso2_Click(object sender, EventArgs e)
        {
            BindingList<Candidato> listaCand = (BindingList<Candidato>)dgvCandidatosAEvaluar.DataSource;
            claves = ControlEvaluacion.GenerarClaves(listaCand);

            var dsFinal = from item in claves 
                          select new {  Apellido = item.Key.Apellido, 
                                        Nombre = item.Key.Nombre, 
                                        TipoDoc = item.Key.TipoDoc.Nombre, 
                                        Documento = item.Key.NroDocumento, 
                                        Clave = item.Value };

            dgvCandidatosFinal.DataSource = dsFinal.ToList();

            Wizard paginas = (Wizard)((Button)sender).Parent.Parent;
            paginas.SelectedIndex = paginas.SelectedIndex + 1;

            this.AcceptButton = btnFinalizar;
            this.CancelButton = btnCancelarPaso3;
        }
        #endregion Paso2

        #region Paso3
        private void btnFinalizar_Click(object sender, EventArgs e)
        {
            Puesto puesto = (Puesto)cbPuesto.Items[cbPuesto.SelectedIndex];
            if (ControlEvaluacion.GenerarEvaluacion(puesto, claves))
            {
                while (true)
                {
                    if (MessageBox.Show(Messages.EXPORTARCANDIDATOSCLAVESEXCEL, Messages.CAPTION, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes)
                    {
                        FolderBrowserDialog fbd = new FolderBrowserDialog();
                        fbd.Description = Messages.TITULOSELECCIONEXPORTAR;
                        if (fbd.ShowDialog() == DialogResult.OK)
                        {
                            if (ControlEvaluacion.GenerarArchivo(claves, puesto, fbd.SelectedPath))
                            {
                                MessageBox.Show(Messages.EXPORTAREXCELEXITO, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            else
                            {
                                MessageBox.Show(Messages.ERROREXPORTAREXCEL, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                Salir();               
            }
            else
            {
                MessageBox.Show(Messages.ERRORALGENERAREVALUACION, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Salir();
            }
        }
        #endregion Paso3        
    }
}
